--
-- Created by IntelliJ IDEA.
-- User: RJ
-- Date: 21/09/16
-- Time: 10:19
-- To change this template use File | Settings | File Templates.
--

--***********************************************************
--**                    ROBERT JOHNSON                     **
--***********************************************************

require "ISUI/ISPanel"

ISServerOptionsChange = ISPanel:derive("ISServerOptionsChange");

local FONT_HGT_SMALL = getTextManager():getFontHeight(UIFont.Small)

--************************************************************************--
--** ISPanel:initialise
--**
--************************************************************************--

function ISServerOptionsChange:initialise()
    ISPanel.initialise(self);
    self:create();
end


function ISServerOptionsChange:setVisible(visible)
    --    self.parent:setVisible(visible);
    self.javaObject:setVisible(visible);
end

function ISServerOptionsChange:render()
    local z = 20;

    self:drawText(getText("IGUI_PlayerStats_ChangeServerOptionTitle"), self.width/2 - (getTextManager():MeasureStringX(UIFont.Medium, getText("IGUI_PlayerStats_ChangeServerOptionTitle")) / 2), z, 1,1,1,1, UIFont.Medium);
    z = z + 50;
    self:drawText(self.option:getName(), 10, z, 1,1,1,1, UIFont.Small);

    if self.errorTxt then
        self:drawText(self.errorTxt, 10, 100, 1,0,0,1, UIFont.Small);
    end

    if instanceof(self.option, "DoubleConfigOption") or instanceof(self.option, "IntegerConfigOption") then
        self:drawText(getText("Sandbox_MinMaxDefault", self.option:getMin(), self.option:getMax(), self.option:getDefaultValue()), 10, 130, 1,1,1,1, UIFont.Small);
    end

    self:updateButtons();
end

function ISServerOptionsChange:create()
    local btnWid = 100
    local btnHgt = math.max(25, FONT_HGT_SMALL + 3 * 2)
    local padBottom = 10

    local y = 70;

    if instanceof(self.option, "BooleanConfigOption") then
        self:setWidth(400);
        local comboWid = getTextManager():MeasureStringX(UIFont.Small, "false") + 30
        self.booleanOption = ISComboBox:new(getTextManager():MeasureStringX(UIFont.Small, self.option:getName()) + 20, y, comboWid, FONT_HGT_SMALL + 2 * 2, nil,nil);
        self.booleanOption:initialise();
        self.booleanOption:addOption("true");
        self.booleanOption:addOption("false");
        self.booleanOption.parent = self;
        self.defaultBool = 1;
        if not self.option:getValue() then
            self.booleanOption.selected = 2;
            self.defaultBool = 2;
        end
        self:addChild(self.booleanOption);
    end

    if instanceof(self.option, "DoubleConfigOption") or instanceof(self.option, "IntegerConfigOption") or instanceof(self.option, "StringConfigOption") then
        local size = getTextManager():MeasureStringX(UIFont.Small, self.option:getValueAsString()) + 20;
        if size > (self:getWidth() - (getTextManager():MeasureStringX(UIFont.Small, self.option:getName() ) + 30)) then
            size = (self:getWidth() - (getTextManager():MeasureStringX(UIFont.Small, self.option:getName()) + 30));
        end
        self.entry = ISTextEntryBox:new(self.option:getValueAsString(), getTextManager():MeasureStringX(UIFont.Small, self.option:getName()) + 20, y, size, FONT_HGT_SMALL + 2 * 2);
        self.entry.font = UIFont.Small
        self.entry:initialise();
        self.entry:instantiate();
        if instanceof(self.option, "DoubleConfigOption") or instanceof(self.option, "IntegerConfigOption") then
            self.entry:setOnlyNumbers(true);
            self.entry.min = self.option:getMin();
            self.entry.max = self.option:getMax();
        end
        self:addChild(self.entry);
        self.defaultText = self.option:getValueAsString();
    end

    self.saveBtn = ISButton:new(10, self:getHeight() - padBottom - btnHgt, btnWid, btnHgt, getText("UI_characreation_BuildSave"), self, ISServerOptionsChange.onOptionMouseDown);
    self.saveBtn.internal = "SAVE";
    self.saveBtn:initialise();
    self.saveBtn:instantiate();
    self.saveBtn.borderColor = self.buttonBorderColor;
    self.saveBtn.enable = false;
    self:addChild(self.saveBtn);

    self.cancel = ISButton:new(self:getWidth() - btnWid - 10, self:getHeight() - padBottom - btnHgt, btnWid, btnHgt, getText("UI_Cancel"), self, ISServerOptionsChange.onOptionMouseDown);
    self.cancel.internal = "CANCEL";
    self.cancel:initialise();
    self.cancel:instantiate();
    self.cancel.borderColor = self.buttonBorderColor;
    self:addChild(self.cancel);

    self.resetBtn = ISButton:new(self.cancel.x - btnWid - 5, self:getHeight() - padBottom - btnHgt, btnWid, btnHgt, getText("IGUI_PlayerStats_ResetToDefault"), self, ISServerOptionsChange.onOptionMouseDown);
    self.resetBtn.internal = "RESET";
    self.resetBtn:initialise();
    self.resetBtn:instantiate();
    self.resetBtn.borderColor = self.buttonBorderColor;
    self.resetBtn:setX(self.cancel.x - 10 - self.resetBtn.width)
    self:addChild(self.resetBtn);

end

function ISServerOptionsChange:updateButtons()
    self.saveBtn.enable = false;
    self.resetBtn.enable = false;
    if self.entry then
        if self.entry:getText() ~= self.defaultText then
            self.saveBtn.enable = true;
        end
        if self.entry:getText() ~= self.option:getDefaultValue() then
            self.resetBtn.enable = true;
        end
    end
    if self.booleanOption then
        if self.booleanOption.selected ~= self.defaultBool then
            self.saveBtn.enable = true;
        end

        if (not self.option:getDefaultValue() and self.booleanOption.selected == 1) or (self.option:getDefaultValue() and self.booleanOption.selected == 2) then
            self.resetBtn.enable = true;
        end
    end
end

function ISServerOptionsChange:onOptionMouseDown(button, x, y)

    if button.internal == "SAVE" then
        self.errorTxt = nil;
        if self.onclick ~= nil then
            if self.booleanOption then
                local newValue = "false";
                if self.booleanOption.selected == 1 then
                    newValue = "true";
                end
                self.onclick(self.target, button.parent.option, newValue);
            end
            if self.entry then
                if self.entry.min then
                    if tonumber(self.entry:getText()) < self.entry.min then
                        self.errorTxt = "The minimum value for this option is " .. self.entry.min;
                        return;
                    end
                end
                if self.entry.max then
                    if tonumber(self.entry:getText()) > self.entry.max then
                        self.errorTxt = "The maximum value for this option is " .. self.entry.max;
                        return;
                    end
                end
                self.onclick(self.target, button.parent.option, self.entry:getText());
            end
            self:setVisible(false);
            self:removeFromUIManager();
        end
    end
    if button.internal == "RESET" then
        if self.booleanOption then
            if not self.option:getDefaultValue() then
                self.booleanOption.selected = 2;
            else
                self.booleanOption.selected = 1;
            end
        end
        if self.entry then
            self.entry:setText(tostring(button.parent.option:getDefaultValue()));
        end
    end
    if button.internal == "CANCEL" then
        self:setVisible(false);
        self:removeFromUIManager();
    end

    self.target.modifying = false;
end

function ISServerOptionsChange:new(x, y, width, height, target, onclick, option)
    local o = {};
    o = ISPanel:new(x, y, width, height);
    setmetatable(o, self);
    self.__index = self;
    o.variableColor={r=0.9, g=0.55, b=0.1, a=1};
    o.borderColor = {r=0.4, g=0.4, b=0.4, a=1};
    o.backgroundColor = {r=0, g=0, b=0, a=0.8};
    o.buttonBorderColor = {r=0.7, g=0.7, b=0.7, a=0.5};
    o.zOffsetSmallFont = 25;
    o.moveWithMouse = true;
    o.target = target;
    o.onclick = onclick;
    o.option = option;
    o.defaultBool = 1;
    o.defaultText = "";

    return o;
end
